Ynoi 做题记录
原来我逻辑也这么差!!!数据结构能说什么呢。。细节自己多想想。
$Ynoi2011-$竞赛实验班/$loj517-$计算几何瞎暴力
不真的全局异或,而是:
- 加入新值,异或上当前 xor 和,丢到等待队列里;
- 排序时把等待队列的值都插到 Trie 里;
- 异或就异或到当前 xor 和上;
- 查询如果涉及到一部分有序一部分无序,就是全局和;否则如果全有序,Trie 上考虑「上次全有序时的 xor 和」下的前 k 项,差分。
维护每个子树各位出现次数和。
坑点:查询,在 Trie 上走的时候按「上次全有序时的 xor 和」,但查子树各位的时候按「当前 xor 和」来。
其实如果你考虑清楚了,这题一点都不坑,甚至还比较小清新。
五彩斑斓的世界
离线询问,对每个块单独做。这样空间就不会炸。
对下标开并查集,权值相同的并一块儿;开一个数组记录每种权值的根的位置。
散块,不支持全局打标记,就暴力改,并趁机重构,清空 $tag$。
整块:
- $maxn \leq 2x$:暴力改所有 $> x$ 的,用 $O(\alpha * (maxn - x))$ 的代价让最大值减少了 $maxn - x$
- $maxn > 2x$:可以看作整体减少 $x$ 再给 $\leq 0$ 的加上 $x$,用 $O(\alpha * x)$ 的代价让最大值减少了 $x$
值域与 $n$ 同阶,单块的复杂度是 $O(n)$ 的,总体 $O(n \sqrt{n} * \alpha)$。
镜中的昆虫
区间数颜色的标准套路:$pre_i$ 表示 $i$ 前一个和 $i$ 颜色相同的位置,那么询问 $[L, R]$ 就是在统计 $pre_i < L$ 的个数。静态就是二维数点。
单点修改怎么做?$pre$ 总修改次数只有 $O(n + m)$,是个带修改二维数点问题。树状数组套线段树可以做,空间也不是很紧。 仅能过 loj 的数据!!ಥ_ಥ
如果加一维时间,看作在每个时间点做完左边的所有修改后查询,就可以 cdq 分治了,每次统计 $[l, mid]$ 的修改对 $(mid, r]$ 的询问的贡献。
区间修改呢?把相同颜色看成一块,考虑均摊分析,如果修改区间不相交显然 $pre$ 的总修改次数是 $O(n)$,如果相交也只会改端点 $O(1)$,总的是 $O(n + 2m)$
为了计算出所有实际的修改,需要开一个 set 维护所有块、颜色数个 set 维护该颜色的块, $O((n + 2m) logn)$
cdq 的不想写了。。下次一定
未来日记
因为这是 Ynoi,值域 $1e5$ 必有其用意。
二分啊主席树的没法和分块有机结合。所以要序列分块套值域分块(
$cnt1_{i, j}$ 表示序列前 $i$ 块在值域第 $j$ 块里出现的次数,$cnt2_{i, j}$ 表示序列前 $i$ 块第 $j$ 个数出现的次数。查询 $kth$ 就先扫值域块确定块,再挨个儿扫过去。
修改呢?散块暴力。整块怎么做?
注意到修改不会增加每块内的颜色种类。这超有用。
块内 $x$、$y$ 同时有的就暴力改,颜色种类减少 $O(n)$ 次,总复杂度 $O(n\sqrt{n})$;否则并查集即可。
这题唯一打标记的就是整块的并查集,而只要在散块重构的时候下推就好了。所以还比较清真?我是超级受不了巨大多 tag 的题 /kk
为了方便在下推的时候快速得到所有的真实颜色,还要记录每个根对应的真实颜色是什么。
$id_{x, c}$ 表示块 $x$ 内颜色 $c$ 的根,$rid_{x, d}$ 表示块 $x$ 内根 $d$ 对应的颜色,$pos_i$ 记录第 $i$ 个位置上的颜色对应的根。把颜色 $y$ 的根指向颜色 $x$ 的根,并清空颜色 $x$ 的根即可。本质是个离散化。